package com.isoftstone.service;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageInfo;
import com.isoftstone.pojo.Student;

import com.isoftstone.pojo.dto.PasswordModifyDTO;
import com.isoftstone.pojo.dto.UpdateStudentDormDto;
import com.isoftstone.util.BusinessException;
import com.isoftstone.util.Result;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;


public interface StudentService {
    //    添加用户
    Result<?> insertStudent(Student student);
    //    查询所有用户
    Page queryAllStudent(Integer currentSize, Integer pageSize);
    //    修改信息
    Result<?> updateStudent(Student student);
    //    删除用户
    Result<?> deleteStudent(Integer id);
    /**
     * 批量删除用户
     * @param ids 用户ID列表
     * @return 成功删除的数量
     */
    int batchDeleteStudents(List<Long> ids);
    /**
     * 根据用户名搜索用户
     * @param name 用户名
     * @param currentSize 当前页
     * @param pageSize 每页大小
     * @return 分页结果
     */
    Page<Student> searchStudentsByName(String name, Integer currentSize, Integer pageSize);

    //    excel文件导出
    void exportExcel(HttpServletResponse response) throws IOException;
    PageInfo<Student> queryReportInfoByPage(String name, String status, Integer currentPage, Integer pageSize);
    /**
     * 1. 统计系别+专业人数
     * @return 统计结果列表
     */
    Result<?> statisticsDeptAndMajor();

    /**
     * 2. 多条件搜索学生（姓名+系别+专业，支持分页）
     * @param name 姓名（可选）
     * @param department 系别（可选）
     * @param major 专业（可选）
     * @param currentPage 当前页
     * @param pageSize 每页条数
     * @return 分页后的学生列表
     */
    Result<?> searchStudentsByMultiCond(
            String name, String department, String major,
            Integer currentPage, Integer pageSize
    );
    /**
     * 新增：修改学生的系别和专业
     * @param id 学生ID
     * @param department 新系别（不可为空）
     * @param major 新专业（不可为空）
     * @return 操作结果（成功/失败原因）
     */
    Result<?> updateDeptAndMajor(Integer id, String department, String major);
    Result<Student> findByStudentNumber(String studentNumber);
    Result<Student> updateStudentDormitory(String studentNumber, UpdateStudentDormDto dto);


    /**
     * 学生登录
     * @param phone 手机号
     * @param password 密码
     * @return 登录成功返回学生信息，失败返回null
     */
    Student login(String phone, String password);
    // 新增注册方法
    void register(String phone, String newPassword) throws BusinessException;
    /**
     * 重置密码（忘记密码功能）
     * @param phone 手机号
     * @param newPassword 新密码
     * @throws BusinessException 业务异常
     */
    void resetPassword(String phone, String newPassword) throws BusinessException;
    /**
     * 更新学生头像URL到数据库
     * @param studentNo 学生学号（唯一标识）
     * @param avatarUrl 头像的完整访问URL
     */
    void updateAvatarUrl(String studentNo, String avatarUrl);

    /**
     * 修改学生密码
     * @param studentNumber 学号
     * @param dto 密码修改数据传输对象
     * @return 统一响应结果
     */
    Result modifyPassword(String studentNumber, PasswordModifyDTO dto);


    Result<Student> getStudentWithDormDetail(String studentNumber);

    /**
     * 根据学号查询学生及其关联的宿舍信息
     * @param studentNumber 学号
     * @return 包含宿舍信息的学生对象
     */
    Result<Student> getStudentWithDormitory(String studentNumber);
}
